#ifndef _CRGEOLOCATION_MAMANAGER_H_
#define _CRGEOLOCATION_MAMANAGER_H_

#include "Resource.h"
#include "ResourceManager.h"
#include "Singleton.h"
#include "String.h"
#include "Database/Field.h"
#include "DataManager.h"

#define DB_NAME_CRGEOLOCATION		"cr_geolocation"

class  Database;
class  WorldPacket;

typedef struct cr_geolocation_tag_
{
	uint64 geo_id;			//地理位置ID
	uint32 type;			//地理位置信息类型
	uint32 status;			//地理位置状态信息
	uint32 uid;				//平台用户ID
	uint32 gz_id;			//当前游戏分区
	uint32 agentid;			//代理商ID
	uint32 gameid;			//当前游戏ID
	String nickname;		//平台用户名
	String icon_url;		//平台用户头像
	uint32 gender;			//用户性别 1 男性 2 女性  3 未知
	
	String ip;				//IP地址
	String ip_addr;			//客户端IP地址，城市，省份信息
	String addr_country;	//国家
	String addr_province;	//省、州地址
	String addr_city;		//城市地址
	String addr_district;	//区，县地址
	String addr_street;		//街道地址
	String addr_poiname;		//PoiName 精确位置点 如XX大楼 XX公园
	String addr_postal_code;	//邮政编码
	String addr_city_code;		//城市编码  如 023
	
	double coord_latitude;		//坐标纬度
	double coord_longitude;		//坐标纬度
	double coord_altitude;		//坐标海拔
	float coord_accuracy;		//坐标精度  （单位米)
	float coord_accuracy_altitude;	//海拔精度 单位米
	float coord_heading;		//移动的方向 范围为0到360，表示相对于正北方向的角度。
	float coord_speed;			//移动的速度  为米每秒（m/s），其有效值必须大于0
	String coord_type;			//“wgs84”：表示WGS-84坐标系； “gcj02”：表示国测局经纬度坐标系； “bd09”：表示百度墨卡托坐标系； “bd09ll”：表示百度经纬度坐标系； provider为“system”时，默认使用“wgs84”类型；provider为“baidu”是，默认使用“bd09ll”类型。
	double coord_time;			//获取位置的时间点 1970年的毫秒
	String geohash;				//地理位置Hash代码，寻找附近
	
	uint32 client_agent_id;		//客服端ID 用于区别不同的APP  1 霸主游戏APP 2 霸主游戏 微信公众号 3 霸主游戏 QQ公众号
	String client_agent_info;	//客服端连接信息
	String create_time;			//记录创建时间
	uint32 last_time;			//最后更新时间
	
	cr_geolocation_tag_()
	{
		Init();
	}
	
	void Init()
	{
		geo_id = 0;
		type = 0;
		status = 0;
		uid = 0;
		gz_id = 0;
		agentid = 0;
		nickname = "";
		icon_url = "";
		gender = 0;
		
		ip = "";
		ip_addr = "";
		addr_country = "";
		addr_province = "";
		addr_city = "";
		addr_district = "";
		addr_street = "";
		addr_poiname = "";
		addr_postal_code = "";
		addr_city_code = "";
		
		coord_latitude = 0.0;
		coord_longitude = 0.0;
		coord_altitude = 0.0;
		coord_accuracy = 0.0f;
		coord_accuracy_altitude = 0.0f;
		coord_heading = 0.0f;
		coord_speed = 0.0f;
		coord_type = "";
		coord_time = 0.0;
		geohash = "";
		
		client_agent_id = 0;
		client_agent_info = "";
		create_time = "";
		last_time = 0;
	}
	
}CRGeoLocation;

#define WGS_CRGEO_MUTEX_NAME cblog_mutex
#define WGS_CRGEO_MUTEX mutable boost::mutex WGS_CRGEO_MUTEX_NAME;
#define WGS_CRGEO_LOCK		boost::lock_guard<boost::mutex> wgsCRGetMutexLock(WGS_CRGEO_MUTEX_NAME);


//-------------------------组局信息-----------------------
class  SERVER_DECL CRGeoLocationManager:public Singleton<CRGeoLocationManager>
{
public:
	WGS_CRGEO_MUTEX
	
	/**
	 * @创建时间 2016-07-13
	 * @创建人 Roach
	 * @函数作用 添加一条CRGeoLocation记录
	 * @参数
	 * 	@cbl	CRGeoLocation
	 */
	bool AddCRGeoLocation(CRGeoLocation & crg);
	
	/**
	 * @创建时间 2016-07-13
	 * @创建人 Roach
	 * @函数作用 更新centerbattlelog
	 * @参数
	 * 	@cbl CRGeoLocation
	 */
	bool UpdateCRGeoLocation(const CRGeoLocation & crg);
	
	/**
	 * @创建时间 2016-07-13
	 * @创建人 Roach
	 * @函数作用 更新friendrecord数据
	 * @参数
	 * 	@cfr_id	
	 *	@fields	字段键值对,格式：fields["key1"] = 1; fields["key2"] = 2;...
	 */
	bool UpdateCRGeoLocation(Fields * fields, const char * QueryString, ...);
	bool UpdateCRGeoLocation(const uint32 & crm_id, Fields * fields);
	
	/**
	 * @创建时间 2016-07-13
	 * @创建人 Roach
	 * @函数作用 根据PD_ID获取一条PD数据
	 * @参数
	 *  @cbl_id 	CRGeoLocation id
	 * 	@cbl		CRGeoLocation
	 */
	bool GetCRGeoLocation(const uint32 & crm_id, CRGeoLocation * cbl);
	
	/**
	 * @创建时间 2016-07-13
	 * @创建人 Roach
	 * @函数作用 获取日志列表
	 * @参数
	 * 	@lstData	CRGeoLocation对象列表
	 *  @query 查询语句条件
	 */
	uint32 GetCRGeoLocationList(std::list<CRGeoLocation> * lstData, const char * query,...);
	
	//===========================逻辑部分=============================
public:
	// 获得玩家经纬度 longitude 精度 latitude 纬度 altitude 海拔
	bool GetUserLongitudeAndLatitude(const uint32 & pid, double & longitude, double & latitude, double & altitude);
};

#define	 sCRGeoLocationMgr		 CRGeoLocationManager::getSingleton()


#endif
